package com.sywl.ytcx.controller.admin;

import com.sywl.ytcx.config.OrderExcelDTO;
import com.sywl.ytcx.entity.order.Order;
import com.sywl.ytcx.entity.res.ResponseResult;
import com.sywl.ytcx.service.OrderListService;
import com.sywl.ytcx.util.ExcelUtil;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;
import java.time.LocalDateTime;
import java.util.List;

@Controller("orderListAdminController")
@RestController
@RequestMapping("/orderList")
public class OrderListController {

    private final OrderListService orderListService;



    @Autowired
    public OrderListController(OrderListService orderListService) {
        this.orderListService = orderListService;
    }


    /** 查询所有待付款的订单 */
    @GetMapping("/pending-payment")
    public ResponseResult getPendingPayment() {
        List<Order> list = orderListService.listPendingPayment();
        return new ResponseResult(200, "查询待付款订单成功", list);
    }

    /** 查询所有已付款的订单 */
    @GetMapping("/paid")
    public ResponseResult getPaid() {
        List<Order> list = orderListService.listPaid();
        return new ResponseResult(200, "查询已付款订单成功", list);
    }

    /** 查询所有待出稿的订单 */
    @GetMapping("/unpublished")
    public ResponseResult getUnpublished() {
        List<Order> list = orderListService.listUnpublished();
        return new ResponseResult(200, "查询待出稿订单成功", list);
    }

    /** 查询所有已出稿的订单 */
    @GetMapping("/published")
    public ResponseResult getPublished() {
        List<Order> list = orderListService.listPublished();
        return new ResponseResult(200, "查询已出稿订单成功", list);
    }


    /** 按用户ID筛选订单 */
    @GetMapping("/by-user/{userId}")
    public ResponseResult getByUserId(@PathVariable int userId) {
        return orderListService.listByUserId(userId);
    }

    /**
     * 按创建时间（created_at）排序查询所有订单
     * @param sortOrder 排序顺序，可选值："asc"（升序）、"desc"（降序），默认 "desc"
     * @return 包含按创建时间排序后的订单列表的 ResponseResult
     */
    @GetMapping("/by-created")
    public ResponseResult getAllByCreatedAt(
            @RequestParam(defaultValue = "desc") String sortOrder) {
        return orderListService.listAllByCreatedAt(sortOrder);
    }

    /**
     * 按订单金额（total_amount）排序查询所有订单
     * @param sortOrder 排序顺序，可选值："asc"（升序）、"desc"（降序），默认 "desc"
     * @return 包含按订单金额排序后的订单列表的 ResponseResult
     */
    @GetMapping("/by-amount")
    public ResponseResult getAllByTotalAmount(
            @RequestParam(defaultValue = "desc") String sortOrder) {
        return orderListService.listAllByTotalAmount(sortOrder);
    }


    /**
     * 按订单号查询单个订单
     * @param orderNumber 订单的订单号
     */
    @GetMapping("/by-number/{orderNumber}")
    public ResponseResult getByOrderNumber(@PathVariable String orderNumber) {
        return orderListService.getByOrderNumber(orderNumber);
    }


    /**
     * 按 order_id 查询
     * @param orderId 订单ID
     **/
    @GetMapping("/{orderId}")
    public ResponseResult getById(@PathVariable Long orderId) {
        return orderListService.getById(orderId);
    }




    /**
     * 导出所有订单信息到 Excel 文件
     * 实现浏览器自动下载 Excel 文件的功能
     * @param response HTTP 响应对象，用于向客户端输出 Excel 数据
     * @throws IOException 当文件写入或网络传输发生异常时抛出
     */
    @GetMapping("/export")
    public void exportAll(HttpServletResponse response) throws IOException {
        // 调用 service 层方法获取所有订单的导出数据（DTO 格式）
        List<OrderExcelDTO> list = orderListService.getAllForExport();

        // 使用工具类将订单数据写入 Excel 并通过响应流返回给浏览器
        // 参数说明：
        // - response: HTTP 响应对象
        // - OrderExcelDTO.class: 数据对应的实体类，用于映射表头
        // - list: 需要导出的数据列表
        // - "所有订单": Excel 文件名
        // - "订单列表": Excel 中的工作表名称
        ExcelUtil.writeSingleSheet(response, OrderExcelDTO.class, list, "所有订单", "订单列表");
    }


    /**
     * 按用户ID导出订单，浏览器自动下载
     * @param userId 用户ID
     */
    @GetMapping("/export/{userId}")
    public void exportByUser(
            HttpServletResponse response,
            @PathVariable Integer userId) throws IOException {
        // 调用 service 层方法获取指定用户的所有订单导出数据（DTO 格式）
        List<OrderExcelDTO> list = orderListService.getByUserForExport(userId);

        // 构造 Excel 文件名，格式为 "用户{userId}-订单"
        String fileName = "用户" + userId + "-订单";

        // 使用工具类将订单数据写入 Excel 并通过响应流返回给浏览器
        // 参数说明：
        // - response: HTTP 响应对象
        // - OrderExcelDTO.class: 数据对应的实体类，用于映射表头
        // - list: 需要导出的数据列表
        // - fileName: 动态生成的 Excel 文件名
        // - "订单列表": Excel 中的工作表名称
        ExcelUtil.writeSingleSheet(response, OrderExcelDTO.class, list, fileName, "订单列表");
    }


    /**
     * 按用户账号查询订单
     * @param account 用户账号
     * @return 订单列表查询结果
     */
    @GetMapping("/account/{account}")
    public ResponseResult getOrdersByAccount(@PathVariable String account) {
        return orderListService.listOrdersByAccount(account);
    }


    /**
     * 获取当天（00:00至当前时间）订单总收入
     */
    @GetMapping("/dailyIncome")
    public ResponseResult getDailyIncome() {
        return orderListService.getDailyIncome();
    }

    /**
     * 获取本月（1号至当前时间）订单总收入
     */
    @GetMapping("/monthlyIncome")
    public ResponseResult getMonthlyIncome() {
        return orderListService.getMonthlyIncome();
    }



    /**
     * 支持日期或日期时间格式：
     * - yyyy-MM-dd
     * - yyyy-MM-dd HH:mm:ss
     */
    @GetMapping("/byDateRange")
    public ResponseResult listByDateRange(
            @RequestParam String dateStart,
            @RequestParam String dateEnd) {
        return orderListService.listByDateRange(dateStart, dateEnd);
    }


    /**
     * 获取所有退款订单
     */
    @GetMapping("/cancelled")
    public ResponseResult cancelledOrders() {
        return orderListService.getCancelledOrders();
    }

    /**
     * 按日期范围查询退款订单
     * @param dateStart 开始日期
     * @param dateEnd 结束日期
     *支持日期或日期时间格式：
     *- yyyy-MM-dd
     *- yyyy-MM-dd HH:mm:ss
     */
    @GetMapping("/cancelledByDate")
    public ResponseResult cancelledByDate(
            @RequestParam String dateStart,
            @RequestParam String dateEnd) {
        return orderListService.getCancelledOrdersByDate(dateStart, dateEnd);
    }


    /**
     * 查询所有帖子的 浏览→下单 转化率列表
     * 返回 VO 列表，封装 postId、viewCount、orderCount、conversionRatePct。
     */
    @GetMapping("/postRates")
    public ResponseResult getPostRates() {
        // 直接调用 Service 获得封装好的 VO 列表
        return orderListService.getPostViewOrderRates();
    }

    /**
     * 查询全站范围的 浏览→下单 整体转化率
     * 返回单个 VO，封装 overallViews、overallOrders、conversionRatePct。
     */
    @GetMapping("/overallRate")
    public ResponseResult getOverallRate() {
        // 直接调用 Service 获得封装好的 VO 对象
        return orderListService.getOverallViewOrderRate();
    }

}
